Pythonã®ãªãã©ã€ã¡ã«ããºã ãæ¢æ±ããå埩åãšèé害æ§ã®ããã·ã¹ãã ã®æ§ç¯ã«äžå¯æ¬ ãªãä¿¡é Œæ§ã®é«ãã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ãšãã€ã¯ããµãŒãã¹ã®ããã®æè¡ã解説ããŸãã
Pythonã®ãªãã©ã€ã¡ã«ããºã ïŒã°ããŒãã«ãŠãŒã¶ãŒåãã«å埩åã®ããã·ã¹ãã ãæ§ç¯ãã
仿¥ã®åæ£åã§ãã°ãã°äºæž¬äžå¯èœãªã³ã³ãã¥ãŒãã£ã³ã°ç°å¢ã§ã¯ãå埩åãšèé害æ§ã®ããã·ã¹ãã ãæ§ç¯ããããšãæéèŠã§ããç¹ã«ã°ããŒãã«ãŠãŒã¶ãŒã«ãµãŒãã¹ãæäŸããã¢ããªã±ãŒã·ã§ã³ã¯ããããã¯ãŒã¯é害ãäžæçãªãµãŒãã¹å©çšäžå¯ããªãœãŒã¹ç«¶åãšãã£ãäžæçãªé害ãé©åã«åŠçã§ããå¿ èŠããããŸããPythonã¯ãã®è±å¯ãªãšã³ã·ã¹ãã ã«ããããªãã©ã€ã¡ã«ããºã ãå®è£ ããããã®ããã€ãã®åŒ·åãªããŒã«ãæäŸããã¢ããªã±ãŒã·ã§ã³ããããã®äžæçãªãšã©ãŒããèªåçã«å埩ããç¶ç¶çãªéçšãç¶æã§ããããã«ããŸãã
ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠãªãã©ã€ã¡ã«ããºã ãäžå¯æ¬ ãªçç±
ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã¯ããªãã©ã€ã¡ã«ããºã ã®éèŠæ§ã匷調ããç¬èªã®èª²é¡ã«çŽé¢ããŠããŸãã
- ãããã¯ãŒã¯ã®äžå®å®æ§: ã€ã³ã¿ãŒãããæ¥ç¶ã¯å°åã«ãã£ãŠå€§ããç°ãªããŸããä¿¡é Œæ§ã®äœãã€ã³ãã©ã¹ãã©ã¯ãã£ãæã€å°åã®ãŠãŒã¶ãŒã«ãµãŒãã¹ãæäŸããã¢ããªã±ãŒã·ã§ã³ã¯ããããã¯ãŒã¯äžæã«ééããå¯èœæ§ãé«ããªããŸãã
- 忣ã¢ãŒããã¯ãã£: çŸä»£ã®ã¢ããªã±ãŒã·ã§ã³ã¯ããã€ã¯ããµãŒãã¹ã忣ã·ã¹ãã ã«äŸåããŠããããšãå€ãããµãŒãã¹éã®éä¿¡é害ã®å¯èœæ§ãé«ãŸããŸãã
- ãµãŒãã¹éè² è·: ç¹ã«ç°ãªãã¿ã€ã ãŸãŒã³ã®ããŒã¯æé垯ã«ããããŠãŒã¶ãŒã¢ã¯ã»ã¹ã®æ¥å¢ã¯ããµãŒãã¹ãéè² è·ã«ããäžæçãªå©çšäžå¯ã«ã€ãªããå¯èœæ§ããããŸãã
- å€éšäŸåæ§: ã¢ããªã±ãŒã·ã§ã³ã¯ãã°ãã°ãµãŒãããŒãã£ã®APIããµãŒãã¹ã«äŸåããŠãããããããææããŠã³ã¿ã€ã ãããã©ãŒãã³ã¹ã®åé¡ãçµéšããããšããããŸãã
- ããŒã¿ããŒã¹æ¥ç¶ãšã©ãŒ: ç¹ã«é«è² è·æã«ãããŠãæç¶çãªããŒã¿ããŒã¹æ¥ç¶é害ã¯äžè¬çã§ãã
é©åãªãªãã©ã€ã¡ã«ããºã ããªããã°ããããã®äžæçãªé害ã¯ã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ãã·ã¥ãããŒã¿æå€±ããããŠãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®äœäžã«ã€ãªããå¯èœæ§ããããŸãããªãã©ã€ããžãã¯ãå®è£ ããããšã§ãã¢ããªã±ãŒã·ã§ã³ã¯ãããã®ãšã©ãŒããèªåçã«å埩ã詊ã¿ãå šäœçãªä¿¡é Œæ§ãšå¯çšæ§ãåäžãããããšãã§ããŸãã
ãªãã©ã€æŠç¥ãçè§£ãã
Pythonã§ã®å®è£ ã«å ¥ãåã«ãäžè¬çãªãªãã©ã€æŠç¥ãçè§£ããããšãéèŠã§ãã
- ã·ã³ãã«ãªãã©ã€: æãåºæ¬çãªæŠç¥ã§ãå詊è¡ã®éã«åºå®ã®é å»¶ãæã¿ãªãããåºå®åæ°ã ãæäœããªãã©ã€ããŸãã
- ææ°é¢æ°çããã¯ãªã: ãã®æŠç¥ã§ã¯ããªãã©ã€éã®é å»¶ãææ°é¢æ°çã«å¢å ãããŸããããã«ãããé害ãçºçããŠãããµãŒãã¹ãç¹°ãè¿ããªã¯ãšã¹ãã§éè² è·ã«ããããšãé¿ããäžã§éèŠã§ããäŸãã°ãé å»¶ã¯1ç§ã次ã«2ç§ã次ã«4ç§ãšããããã«å¢å ããŸãã
- ãžãã¿ãŒ: é å»¶ã«å°éã®ã©ã³ãã ãªå€åïŒãžãã¿ãŒïŒãå ããããšã§ãè€æ°ã®ã¯ã©ã€ã¢ã³ããåæã«ãªãã©ã€ããŠãµãŒãã¹ãããã«éè² è·ã«ããããšãé²ãã®ã«åœ¹ç«ã¡ãŸãã
- ãµãŒããããã¬ãŒã«ãŒ: ãã®ãã¿ãŒã³ã¯ã倱æããå¯èœæ§ãé«ãæäœãã¢ããªã±ãŒã·ã§ã³ãç¹°ãè¿ã詊ã¿ãã®ãé²ããŸããäžå®æ°ã®å€±æã®åŸããµãŒããããã¬ãŒã«ãŒã¯ããªãŒãã³ãç¶æ ã«ãªããæå®ãããæéããããªã詊è¡ã黿¢ããŸããã¿ã€ã ã¢ãŠãåŸããµãŒããããã¬ãŒã«ãŒã¯ãããŒããªãŒãã³ãç¶æ ã«ãªãããµãŒãã¹ãå埩ãããã©ããããã¹ãããããã«éãããæ°ã®ãªã¯ãšã¹ããééãããŸãããªã¯ãšã¹ããæåããã°ããµãŒããããã¬ãŒã«ãŒã¯ãã¯ããŒãºãç¶æ ã«ãªããéåžžã®éçšãåéããŸãã
- ãããã©ã€ã³ä»ããªãã©ã€: æéå¶éãèšå®ãããŸããæå€§ãªãã©ã€åæ°ã䜿ãæããããŠããªããŠãããããã©ã€ã³ã«éãããŸã§ãªãã©ã€ã詊è¡ãããŸãã
`tenacity` ã䜿çšããPythonã§ã®ãªãã©ã€ã¡ã«ããºã ã®å®è£
`tenacity` ã©ã€ãã©ãªã¯ãã³ãŒãã«ãªãã©ã€ããžãã¯ã远å ããããã®äººæ°ã®ãã匷åãªPythonã©ã€ãã©ãªã§ããäžæçãªãšã©ãŒãåŠçããããã®æè»ã§æ§æå¯èœãªæ¹æ³ãæäŸããŸãã
ã€ã³ã¹ããŒã«
pip ã䜿çšã㊠`tenacity` ãã€ã³ã¹ããŒã«ããŸãã
pip install tenacity
åºæ¬çãªãªãã©ã€ã®äŸ
`tenacity` ã䜿çšããŠã倱æããå¯èœæ§ã®ãã颿°ããªãã©ã€ããç°¡åãªäŸã以äžã«ç€ºããŸãã
from tenacity import retry, stop_after_attempt
@retry(stop=stop_after_attempt(3))
def unreliable_function():
print("Attempting to connect to the database...")
# Simulate a potential database connection error
import random
if random.random() < 0.5:
raise IOError("Failed to connect to the database")
else:
print("Successfully connected to the database!")
return "Database connection successful"
try:
result = unreliable_function()
print(result)
except IOError as e:
print(f"Failed to connect after multiple retries: {e}")
ãã®äŸã§ã¯:
- `@retry(stop=stop_after_attempt(3))` ã¯ã`unreliable_function` ã«ãªãã©ã€ããžãã¯ãé©çšãããã³ã¬ãŒã¿ãŒã§ãã
- `stop_after_attempt(3)` ã¯ã颿°ãæå€§3åãªãã©ã€ãããã¹ãã§ããããšãæå®ããŸãã
- `unreliable_function` ã¯ãã©ã³ãã ã«å€±æããå¯èœæ§ã®ããããŒã¿ããŒã¹æ¥ç¶ãã·ãã¥ã¬ãŒãããŸãã
- `try...except` ãããã¯ã¯ããã¹ãŠã®ãªãã©ã€ãå°œããåŸã«é¢æ°ã倱æããå Žåã«çºçããå¯èœæ§ããã `IOError` ãåŠçããŸãã
ææ°é¢æ°çããã¯ãªããšãžãã¿ãŒã®äœ¿çš
ææ°é¢æ°çããã¯ãªããšãžãã¿ãŒãå®è£ ããã«ã¯ã`tenacity` ãæäŸãã `wait` æŠç¥ã䜿çšã§ããŸãã
from tenacity import retry, stop_after_attempt, wait_exponential, wait_random
@retry(stop=stop_after_attempt(5), wait=wait_exponential(multiplier=1, min=1, max=10) + wait_random(0, 1))
def unreliable_function_with_backoff():
print("Attempting to connect to the API...")
# Simulate a potential API error
import random
if random.random() < 0.7:
raise Exception("API request failed")
else:
print("API request successful!")
return "API request successful"
try:
result = unreliable_function_with_backoff()
print(result)
except Exception as e:
print(f"API request failed after multiple retries: {e}")
ãã®äŸã§ã¯:
- `wait_exponential(multiplier=1, min=1, max=10)` ã¯ãææ°é¢æ°çããã¯ãªããå®è£ ããŸããé å»¶ã¯1ç§ããå§ãŸããæå€§10ç§ãŸã§ææ°é¢æ°çã«å¢å ããŸãã
- `wait_random(0, 1)` ã¯ãé å»¶ã«0ãã1ç§ã®ã©ã³ãã ãªãžãã¿ãŒã远å ããŸãã
ç¹å®ã®äŸå€ã®åŠç
`tenacity` ãç¹å®ã®äŸå€ã®å Žåã®ã¿ãªãã©ã€ããããã«èšå®ããããšãã§ããŸãã
from tenacity import retry, stop_after_attempt, retry_if_exception_type
@retry(stop=stop_after_attempt(3), retry=retry_if_exception_type(ConnectionError))
def unreliable_network_operation():
print("Attempting network operation...")
# Simulate a potential network connection error
import random
if random.random() < 0.3:
raise ConnectionError("Network connection failed")
else:
print("Network operation successful!")
return "Network operation successful"
try:
result = unreliable_network_operation()
print(result)
except ConnectionError as e:
print(f"Network operation failed after multiple retries: {e}")
except Exception as e:
print(f"An unexpected error occurred: {e}")
ãã®äŸã§ã¯:
- `retry_if_exception_type(ConnectionError)` ã¯ã`ConnectionError` ãçºçããå Žåã«ã®ã¿é¢æ°ããªãã©ã€ãããã¹ãã§ããããšãæå®ããŸãããã®ä»ã®äŸå€ã¯ãªãã©ã€ãããŸããã
ãµãŒããããã¬ãŒã«ãŒã®äœ¿çš
`tenacity` ã¯ãµãŒããããã¬ãŒã«ãŒã®å®è£ ãçŽæ¥æäŸããŠããŸããããå¥ã®ãµãŒããããã¬ãŒã«ãŒã©ã€ãã©ãªãšçµ±åããããç¬èªã®ã«ã¹ã¿ã ããžãã¯ãå®è£ ãããããããšãã§ããŸããåºæ¬çãªãµãŒããããã¬ãŒã«ãŒãå®è£ ããæ¹æ³ã®ç°¡ç¥åãããäŸã以äžã«ç€ºããŸãã
import time
from tenacity import retry, stop_after_attempt, retry_if_exception_type
class CircuitBreaker:
def __init__(self, failure_threshold, reset_timeout):
self.failure_threshold = failure_threshold
self.reset_timeout = reset_timeout
self.failure_count = 0
self.last_failure_time = None
self.state = "CLOSED"
def call(self, func, *args, **kwargs):
if self.state == "OPEN":
if time.time() - self.last_failure_time > self.reset_timeout:
self.state = "HALF_OPEN"
else:
raise Exception("Circuit breaker is open")
try:
result = func(*args, **kwargs)
self.reset()
return result
except Exception as e:
self.record_failure()
raise e
def record_failure(self):
self.failure_count += 1
self.last_failure_time = time.time()
if self.failure_count >= self.failure_threshold:
self.open()
def open(self):
self.state = "OPEN"
print("Circuit breaker opened")
def reset(self):
self.failure_count = 0
self.state = "CLOSED"
print("Circuit breaker closed")
def unreliable_service():
import random
if random.random() < 0.8:
raise Exception("Service unavailable")
else:
return "Service is available"
# Example Usage
circuit_breaker = CircuitBreaker(failure_threshold=3, reset_timeout=10)
for _ in range(10):
try:
result = circuit_breaker.call(unreliable_service)
print(f"Service result: {result}")
except Exception as e:
print(f"Error: {e}")
time.sleep(1)
ãã®äŸã§ã¯ã以äžãè¡ãåºæ¬çãªãµãŒããããã¬ãŒã«ãŒã瀺ããŠããŸãã
- 倱æåæ°ã远跡ããŸãã
- äžå®æ°ã®å€±æåŸããµãŒããããã¬ãŒã«ãŒããªãŒãã³ããŸãã
- ã¿ã€ã ã¢ãŠãåŸããããŒããªãŒãã³ãç¶æ ã§ã®éãããæ°ã®ãªã¯ãšã¹ããééãããŸãã
- ãããŒããªãŒãã³ãç¶æ ã§ã®ãªã¯ãšã¹ããæåããå ŽåããµãŒããããã¬ãŒã«ãŒãã¯ããŒãºããŸãã
éèŠãªæ³šæç¹: ããã¯ç°¡ç¥åãããäŸã§ããæ¬çªç°å¢ã«å¯Ÿå¿ãããµãŒããããã¬ãŒã«ãŒã®å®è£ ã¯ããè€éã§ãèšå®å¯èœãªã¿ã€ã ã¢ãŠããã¡ããªã¯ã¹è¿œè·¡ãç£èŠã·ã¹ãã ãšã®çµ±åãªã©ã®æ©èœãå«ãŸããå ŽåããããŸãã
ãªãã©ã€ã¡ã«ããºã ã«ãããã°ããŒãã«ãªèæ ®äºé
ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³åãã«ãªãã©ã€ã¡ã«ããºã ãå®è£ ããéã«ã¯ã以äžã®ç¹ãèæ ®ããŠãã ããã
- ã¿ã€ã ã¢ãŠã: ããŸããŸãªå°åã§ã®ãããã¯ãŒã¯é å»¶ãèæ ®ãããªãã©ã€ããã³ãµãŒããããã¬ãŒã«ãŒã«é©åãªã¿ã€ã ã¢ãŠããèšå®ããŸããåç±³ã§ååãªã¿ã€ã ã¢ãŠãã§ããæ±åã¢ãžã¢ãžã®æ¥ç¶ã«ã¯äžååãªå ŽåããããŸãã
- åªçæ§ (Idempotency): ãªãã©ã€ãããæäœãåªçã§ããããšã確èªããŠãã ãããã€ãŸããæå³ããªãå¯äœçšãåŒãèµ·ããããšãªãè€æ°åå®è¡ã§ããããšãæå³ããŸããäŸãã°ãã«ãŠã³ã¿ã®å¢åã¯åªçãªæäœã§ã¯é¿ããã¹ãã§ããæäœãåªçã§*ãªã*å Žåã¯ããªãã©ã€ã¡ã«ããºã ããã®æäœã*æ£ç¢ºã«*1åã ãå®è¡ããããã«ããããè€æ°ã®å®è¡ãä¿®æ£ããããã®è£åãã©ã³ã¶ã¯ã·ã§ã³ãå®è£ ããå¿ èŠããããŸãã
- ãã®ã³ã°ãšç£èŠ: ãªãã©ã€è©Šè¡ã倱æããµãŒããããã¬ãŒã«ãŒã®ç¶æ ã远跡ããããã«ãå æ¬çãªãã®ã³ã°ãšç£èŠãå®è£ ããŸããããã«ãããåé¡ã®ç¹å®ãšèšºæã«åœ¹ç«ã¡ãŸãã
- ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹: ç¡æéã«æäœããªãã©ã€ããããšã¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®äœäžã«ã€ãªããå¯èœæ§ãããããé¿ããŠãã ããããŠãŒã¶ãŒã«ã¯æ å ±ãæäŸãããšã©ãŒã¡ãã»ãŒãžã衚瀺ããå¿ èŠã«å¿ããŠæåã§ã®ãªãã©ã€ãèš±å¯ããŸãã
- å°åã®ã¢ãã€ã©ããªãã£ãŸãŒã³: ã¯ã©ãŠããµãŒãã¹ã䜿çšããŠããå Žåã¯ãå埩åãåäžãããããã«è€æ°ã®ã¢ãã€ã©ããªãã£ãŸãŒã³ã«ã¢ããªã±ãŒã·ã§ã³ããããã€ããŸãããªãã©ã€ããžãã¯ã¯ãããã¢ãã€ã©ããªãã£ãŸãŒã³ãå©çšã§ããªããªã£ãå Žåã«ãå¥ã®ã¢ãã€ã©ããªãã£ãŸãŒã³ã«ãã§ã€ã«ãªãŒããŒããããã«æ§æã§ããŸãã
- æåçæåæ§: ãŠãŒã¶ãŒã«ãšã©ãŒã¡ãã»ãŒãžã衚瀺ããéã«ã¯ãæåçãªéãã«çæããäžå¿«ãŸãã¯ç¡ç¥çµãªèšèã®äœ¿çšãé¿ããŠãã ããã
- ã¬ãŒãå¶é: ãªãã©ã€ãªã¯ãšã¹ãã§äŸåãµãŒãã¹ãéè² è·ã«ããªãããã«ãã¬ãŒãå¶éãå®è£ ããŸããããã¯ããµãŒãããŒãã£ã®APIãšããåãããéã«ç¹ã«éèŠã§ãããµãŒãã¹ã®çŸåšã®è² è·ã«åºã¥ããŠã¬ãŒãã調æŽããé©å¿åã¬ãŒãå¶éæŠç¥ã®äœ¿çšãæ€èšããŠãã ããã
- ããŒã¿ã®äžè²«æ§: ããŒã¿ããŒã¹æäœããªãã©ã€ããéã«ã¯ãããŒã¿ã®äžè²«æ§ãç¶æãããããã«ããŸãããã©ã³ã¶ã¯ã·ã§ã³ããã®ä»ã®ã¡ã«ããºã ã䜿çšããŠãããŒã¿ã®ç Žæãé²ããŸãã
äŸ: ã°ããŒãã«æ±ºæžã²ãŒããŠã§ã€ãžã®APIã³ãŒã«ããªãã©ã€ãã
äžçäžã®é¡§å®¢ããæ¯æããåãå ¥ããeã³ããŒã¹ãã©ãããã©ãŒã ãæ§ç¯ããŠãããšããŸãããã©ã³ã¶ã¯ã·ã§ã³ãåŠçããããã«ããµãŒãããŒãã£ã®æ±ºæžã²ãŒããŠã§ã€APIã«äŸåããŠããŸãããã®APIã¯ãææããŠã³ã¿ã€ã ãããã©ãŒãã³ã¹ã®åé¡ãçµéšããå¯èœæ§ããããŸãã
`tenacity` ã䜿çšããŠæ±ºæžã²ãŒããŠã§ã€ãžã®APIã³ãŒã«ããªãã©ã€ããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
import requests
from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type
class PaymentGatewayError(Exception):
pass
@retry(stop=stop_after_attempt(5),
wait=wait_exponential(multiplier=1, min=1, max=30),
retry=retry_if_exception_type((requests.exceptions.RequestException, PaymentGatewayError)))
def process_payment(payment_data):
try:
# Replace with your actual payment gateway API endpoint
api_endpoint = "https://api.example-payment-gateway.com/process_payment"
# Make the API request
response = requests.post(api_endpoint, json=payment_data, timeout=10)
response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx)
# Parse the response
data = response.json()
# Check for errors in the response
if data.get("status") != "success":
raise PaymentGatewayError(data.get("message", "Payment processing failed"))
return data
except requests.exceptions.RequestException as e:
print(f"Request Exception: {e}")
raise # Re-raise the exception to trigger retry
except PaymentGatewayError as e:
print(f"Payment Gateway Error: {e}")
raise # Re-raise the exception to trigger retry
# Example usage
payment_data = {
"amount": 100.00,
"currency": "USD",
"card_number": "...",
"expiry_date": "...",
"cvv": "..."
}
try:
result = process_payment(payment_data)
print(f"Payment processed successfully: {result}")
except Exception as e:
print(f"Payment processing failed after multiple retries: {e}")
ãã®äŸã§ã¯:
- 決æžã²ãŒããŠã§ã€APIã«ç¹æã®ãšã©ãŒãåŠçããããã«ãã«ã¹ã¿ã ã® `PaymentGatewayError` äŸå€ãå®çŸ©ããŸãã
- `retry_if_exception_type` ã䜿çšããŠã`requests.exceptions.RequestException` (ãããã¯ãŒã¯ãšã©ãŒã®å Žå) ãš `PaymentGatewayError` ã®ã¿ã§ãªãã©ã€ããŸãã
- APIãªã¯ãšã¹ããç¡æéã«ãã³ã°ã¢ããããã®ãé²ãããã«ãã¿ã€ã ã¢ãŠãã10ç§ã«èšå®ããŸãã
- `response.raise_for_status()` ã䜿çšããŠãäžæ£ãªã¬ã¹ãã³ã¹ (4xxãŸãã¯5xx) ã«å¯ŸããŠHTTPErrorãçºçãããŸãã
- ã¬ã¹ãã³ã¹ã¹ããŒã¿ã¹ã確èªããæ¯æãåŠçã倱æããå Žå㯠`PaymentGatewayError` ãçºçãããŸãã
- æå°é å»¶1ç§ãæå€§é å»¶30ç§ã®ææ°é¢æ°çããã¯ãªãã䜿çšããŸãã
ãã®äŸã¯ã`tenacity` ã䜿çšããŠãäžæçãªAPIãšã©ãŒãåŠçããæ¯æãã確å®ã«åŠçãããããã«ããå ç¢ã§èé害æ§ã®ããæ¯æãåŠçã·ã¹ãã ãæ§ç¯ããæ¹æ³ã瀺ããŠããŸãã
`tenacity` ã®ä»£æ¿ææ®µ
`tenacity` ã¯äººæ°ã®ããéžæè¢ã§ãããä»ã®ã©ã€ãã©ãªãã¢ãããŒãã§ãåæ§ã®çµæãéæã§ããŸãã
- `retrying` ã©ã€ãã©ãª: ãªãã©ã€ã®ããã®ãã1ã€ã®å®è©ããPythonã©ã€ãã©ãªã§ã`tenacity` ãšåçã®æ©èœãæäŸããŸãã
- `aiohttp-retry` (éåæã³ãŒãçš): éåæã³ãŒã (`asyncio`) ãæ±ãå Žåã`aiohttp-retry` 㯠`aiohttp` ã¯ã©ã€ã¢ã³ãã«ç¹åãããªãã©ã€æ©èœãæäŸããŸãã
- ã«ã¹ã¿ã ãªãã©ã€ããžãã¯: ããã·ã³ãã«ãªã·ããªãªã§ã¯ã`try...except` ãããã¯ãš `time.sleep()` ã䜿çšããŠç¬èªã®ãªãã©ã€ããžãã¯ãå®è£ ã§ããŸããããããããè€éãªã·ããªãªã§ã¯ã`tenacity` ã®ãããªå°çšã©ã€ãã©ãªã䜿çšããããšãäžè¬çã«æšå¥šãããŸããããã¯ãããé«ãæè»æ§ãšèšå®å¯èœæ§ãæäŸããããã§ãã
- ãµãŒãã¹ã¡ãã·ã¥ (äŸ: Istio, Linkerd): ãµãŒãã¹ã¡ãã·ã¥ã¯ãã¢ããªã±ãŒã·ã§ã³ã³ãŒãã倿Žããããšãªãã€ã³ãã©ã¹ãã©ã¯ãã£ã¬ãã«ã§èšå®ã§ãããçµã¿èŸŒã¿ã®ãªãã©ã€ããã³ãµãŒããããã¬ãŒã«ãŒæ©èœãæäŸããããšããããããŸãã
çµè«
ãªãã©ã€ã¡ã«ããºã ã®å®è£ ã¯ãç¹ã«åæ£ç°å¢ã®è€éããåŠçããå¿ èŠãããã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠãå埩åãšèé害æ§ã®ããã·ã¹ãã ãæ§ç¯ããããã«äžå¯æ¬ ã§ããPythonã¯ã`tenacity` ã®ãããªã©ã€ãã©ãªã䜿çšããããšã§ãã³ãŒãã«ãªãã©ã€ããžãã¯ãç°¡åã«è¿œå ããããŒã«ãæäŸããã¢ããªã±ãŒã·ã§ã³ã®ä¿¡é Œæ§ãšå¯çšæ§ãåäžãããŸããç°ãªããªãã©ã€æŠç¥ãçè§£ãããããã¯ãŒã¯é å»¶ãæåçæåæ§ãªã©ã®ã°ããŒãã«ãªèŠå ãèæ ®ããããšã§ãäžçäžã®é¡§å®¢ã«ã·ãŒã ã¬ã¹ã§ä¿¡é Œæ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®èŠä»¶ãæ éã«æ€èšããããŒãºã«æé©ãªãªãã©ã€æŠç¥ãšæ§æãéžæããããšãå¿ããªãã§ãã ãããé©åãªãã®ã³ã°ãç£èŠãããã³ãã¹ããããªãã©ã€ã¡ã«ããºã ã广çã«æ©èœããããŸããŸãªé害æ¡ä»¶äžã§ã¢ããªã±ãŒã·ã§ã³ãæåŸ ã©ããã«åäœããããšã確èªããããã«äžå¯æ¬ ã§ãã